package cn.dengta.webapp.risk.bean;

import java.util.Map;
import java.util.UUID;

import cn.dengta.context.model.*;
import cn.dengta.webapp.risk.config.SmCheckConfig;
import cn.dengta.webapp.risk.dto.ZegoParam;
import lombok.Getter;
import lombok.Setter;

/**
 * 数美音频流请求参数类
 *
 * @author zw
 * @since 2022-06-13
 */
@Getter
@Setter
public class RiskAudioStream extends RiskBase {

	/** 事件标识 数美提供固定值：交友秀场：live；1v1交友：message */
	private String eventId;

	/**
	 * 识别类型，可选值：Y
	 * PORN：色情识别
	 * ABUSE: 辱骂识别
	 * AD：广告识别
	 * POLITICAL：涉政识别
	 * MOAN：娇喘识别
	 * ANTHEN：国歌识别
	 * SING：唱歌识别
	 * LANGUAGE：语种识别
	 * MINOR：未成年人识别
	 * <p>
	 * 以上 type 可以下划线组合，如 POLITICAL_PORN_MOAN_AD 用于广告、色情和涉政,娇喘识别。
	 */
	private String type;

	/** 音频唯一标识(长度限制128) Y */
	private String btId;

	/** 回调接口 Y */
	private String callback;

	/** 请求参数  Y */
	private AudioStreamData data;

	public RiskAudioStream() {
		init();
	}

	public static RiskAudioStream of(SmCheckConfig smCheckConfig, AudioStreamData audioStreamData) {
		RiskAudioStream riskAudioStream = new RiskAudioStream();
		riskAudioStream.setEventId(smCheckConfig.getMessageEventId());
		riskAudioStream.setBtId(audioStreamData.getBtId());
		riskAudioStream.setData(audioStreamData);
		riskAudioStream.setCallback(smCheckConfig.getAudioStreamUrl());
		riskAudioStream.setType(smCheckConfig.getAudioStreamType());
		return riskAudioStream;
	}

	@Getter
	@Setter
	public static class AudioStreamData {

		/** 音频唯一标识(长度限制128) Y */
		private String btId;

		/** 流类型  Y 声网录制：AGORA */
		private String streamType;

		/** 账号唯一标识 */
		private String tokenId;

		/** 即构配置参数(调用方提供) */
		private ZegoParam zegoParam;

		/**
		 * 当即构客户端init初始化支持隔离域名和随机userId该字段必传,可选值：
		 * 0：默认版本
		 * 1：仅支持客户端初始化有隔离域名
		 * 2：支持客户端初始化有隔离域名和随机userId功能
		 * 3：更新SDK，修复一些bug
		 * 4：支持客户自定义传入SEI信息
		 * 5：支持vad静音检测，token会有唯一性校验，每次上传鉴黄必须重新生成
		 * 推荐使用5进行接入； 为兼容老客户使用，默认值为0
		 */

		private Integer initDomain;

		/** 渠道配置（AUDIO） */
		private String channel;
		/** 扩展字段 该字段内容会随着回调结果一起原样返回 */
		private Map extra;

		private String lang;

		public void init() {
			this.streamType = RiskConstants.ZEGO;
			this.channel = RiskConstants.AUDIO_STREAM_CHANNEL;
			this.initDomain = 5;
		}

		public static AudioStreamData of(Long triggerUserId, String channelName, ZegoParam zegoParam, WesKit wesKit, Language language) {
			AudioStreamData audioStreamData = new AudioStreamData();
			audioStreamData.init();
			audioStreamData.setZegoParam(zegoParam);
			audioStreamData.setTokenId(Member.encode(triggerUserId));
			audioStreamData.setBtId(UUID.randomUUID().toString());
			audioStreamData.setChannel(channelName);
			audioStreamData.setExtra(Map.of("passThrough", Map.of("channelName", channelName)));
			language = language == null ? wesKit.interior ? Language.zh_CN : Language.en : language;

			String lang = switch (language) {
				case zh_CN, zh -> "zh";
				case vi -> "vi";
				case ko_KR -> "ko";
				case ja_JP -> "ja";
				case th_TH -> "th";
				case in_ID -> "id";
				case ms -> "ms";
				case en -> "en";
				case es -> "es";
				case pt -> "pt";
			};
			audioStreamData.setLang(lang);
			return audioStreamData;
		}

	}

}
